/*
 * @lc app=leetcode.cn id=15 lang=java
 *
 * [15] 三数之和
 */

// @lc code=start

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        int len = nums.length;
        Arrays.sort(nums);
        for(int i=0; i < len-2;i++){
            if(i > 0 && nums[i] == nums[i-1]) continue;

            int l = i + 1, r = len-1;
            
            while(l < r){
                int sum = nums[i] + nums[l] + nums[r];
                if(sum > 0 ){
                    r--;
                } else if(sum < 0){
                    l++;
                } else {
                    ans.add(Arrays.asList(nums[i],nums[l],nums[r]));
                    l++;
                    while (l < r && nums[l] == nums[l-1]) l++;
                    r--;                        
                    while (l < r && nums[r] == nums[r+1]) r--;
                }
            }
        }
        return ans;
    }
}
// @lc code=end

